home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 151-175 / 169 / src / shell / fexec2.asm < prev    next >
Assembly Source File  |  1995-03-13  |  2KB  |  52 lines

  1.  
  2. ;FEXEC2.ASM
  3. ;
  4.  
  5. ;  Again, this code originated from Manx, but has been heavily re-written
  6. ;
  7.  
  8.       xdef  _doexec
  9.       xref  _LVOFreeMem
  10.       xref  _SysRegs
  11.       xref  _SysBase
  12.       xref  _savsp
  13.       xref  _savefp
  14.  
  15.  
  16. ;
  17. ;doexec(len, arg, (seg+1)<<2, stk)
  18. ;       D0    A0    A4        A7
  19. ;
  20.  
  21.         FAR data                ;because we totally trash A4 within the
  22.         FAR code                ;routine.
  23.  
  24. _doexec:
  25.    move.l   sp,_savefp            ;Save Frame Pointer
  26.    movem.l  d2-d7/a2-a6,-(sp)    ;save Registers
  27.    move.l   sp,_savsp             ;save current SP
  28.    lea     _SysRegs,A0
  29.    movem.l  (A0),D0-D7/A0-A6     ;Get System Startup Registers (BCPL stuff)
  30.    move.l   _savefp,A0            ;A0 = frame pointer
  31.    movem.l  4(A0),d0/a0/a4/a7    ;load parameters, including new SP
  32.    move.l   d0,12(a1)            ;set length
  33.    move.l   a0,d1                ;copy to dreg
  34.    lsr.l    #2,d1                ;convert to BPTR
  35.    move.l   d1,8(a1)             ;set ptr
  36.    jsr      (a4)                 ;call new program
  37.    movem.l  (sp)+,d2/d3          ;get stk siz and old sp
  38.    move.l   sp,a1                ;save current sp
  39.    move.l   _savsp,sp             ;get back our sp
  40.    move.l   d0,-(sp)             ;save return code so we don't loose it
  41.    sub.l    d2,a1                ;Backup from end of stack to start
  42.    sub.l    #8,a1                ;point over header placed on stack
  43.    move.l   (a1),d0              ;get size to free
  44.    move.l   _SysBase,a6          ;get ExecBase
  45.    jsr      _LVOFreeMem(a6)      ;Free memory allocated for stack
  46.    move.l   (sp)+,d0             ;D0 = return code
  47.    movem.l  (sp)+,D2-D7/A2-A6    ;restore Registers
  48.    rts
  49.  
  50.  
  51.  
  52.